home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / criterrc.zip / CRITERR.LST < prev    next >
File List  |  1991-02-17  |  15KB  |  332 lines

  1. Turbo Assembler     Version 2.0        02/17/91 12:40:52        Page 1
  2. criterr.asm
  3. CRITERR.ASM
  4. TRAP CRITICAL ERRORS FROM W/IN C
  5.  
  6.       1
  7.       2
  8.       3                     ; MODULE CRITERR.ASM
  9.       4                     ; JANUARY 1991
  10.       5                     ; PETER HYMAN (609) 799-2638
  11.       6                     ; 148 TENNYSON DRIVE
  12.       7                     ; PLAINSBORO, NJ  08536
  13.       8
  14.       9                     ; MODIFIED    2/16/91    SEE NOTES AT END OF SOURCE FOR DESCRIPTION OF CHANGES
  15.      10
  16.      11                     ;;;;; TWO FUNCTIONS ;;;;;
  17.      12
  18.      13                     ; FUNCTION    NAME:  CRITERR(    ONOFF )
  19.      14                     ; INPUTS 1    = TRAP CRITICAL    ERRORS,    0 TURN OFF TRAP
  20.      15                     ; RETURNS 0 IF SUCCESSFUL,    1 IF ALREADY INSTALLED
  21.      16
  22.      17                     ; FUNCTION    NAME:  CLRCRITERR( )
  23.      18                     ; CLEAR CRITICAL ERROR VARIABLES
  24.      19
  25.      20                     ; ON CRITICAL ERRORS, INT 24H HANDLER WILL    RETURN AN IGNORE CODE TO DOS
  26.      21                     ; IF VERSION < 3, OR A FAIL CODE FOR DOS >= 3
  27.      22                     ; IF VERSION >= 3,    DOS FUNCTION 59H IS CALLED ALSO, AND EXTENDED ERROR
  28.      23                     ; INFO IS ALSO PUT    INTO STRUCTURE
  29.      24
  30.      25                     ;;;;; USES    SIMPLIFIED SEGMENT DIRECTIVES.    ASSEMBLE WITH I8086S, M, C OR L
  31.      26                     ;;;;; DEFINED
  32.      27
  33.      28                     ;;;;; ASSEMBLE AS MASM/TASM /mx /dI8086[S|M|C|L] criterr;
  34.      29                     ;;;;; TURBO ASSEMBLER YIELDS SMALLER CODE WITH /Q OPTION
  35.      30
  36.      31    0000                         .MODEL  LARGE
  37.      32          =    0006                     p equ 6
  38.      33          =    0001                     LCODE EQU 1
  39.      34          =    0001                     LDATA EQU 1
  40.      35
  41.      36                     ;;;;; FORMAT FOR CRITICAL ERROR  HEADER BLOCK ;;;;;
  42.      37                     ;;;;; CERTAIN CHAR    VARIABLES EXPANDED TO INT FOR PROPER ALLIGNMENT    ;;;;;
  43.      38    *000                 CERR         STRUC   ; critical    error structure
  44.      39    *000  01*(??)             ceflag         db      ?  ; flag to indicate    critical error 1 = yes
  45.      40    *001  01*(??)             cerrno         db      ?  ; critical    error number  ;    2/16/91    changed    to byte
  46.      41    *002  01*(????)             cerrtype         dw      ?  ; critical    error type/action/drive, AX
  47.      42    *004  01*(??)             drive         db      ?  ; drive letter as a char
  48.      43    *005  01*(??)             read_wr         db      ?  ; read or write error 1 = write
  49.      44    *006  01*(??)             disk_area         db      ?  ; area of error, 0    = dos area, 1 =    fat, 2 = dir, 3    = data
  50.      45    *007  01*(??)             resp_mask         db      ?  ; allowable responses (moot)
  51.      46    *008  01*(??)             exterr         db      ?  ; extended    error number  DOS >= 3 2/16/91 changed to byte
  52.      47    *009  01*(??)             eclass         db      ?  ; error class
  53.      48    *00A  01*(??)             action         db      ?  ; action recommendations
  54.      49    *00B  01*(??)             locus         db      ?  ; locus
  55.      50    *00C  01*(????????)         nextdev         dd      ?  ; next device pointer
  56.      51    *010  01*(????)             attr         dw      ?  ; device attribute
  57.      52    *012  01*(????)             nxtfunc         dw      ?  ; pointer to next strategy    function
  58.      53    *014  01*(????)             intfunc         dw      ?  ; pointer to interrupt function
  59.      54    *016  01*(08*(??))         devname         db      8 dup(?)   ; device name
  60.      55    *01E  01*(??)             dummy         db      ?  ; terminating null
  61.      56    *01F                 CERR    ENDS
  62.      57
  63. Turbo Assembler     Version 2.0        02/17/91 12:40:52        Page 2
  64. criterr.asm
  65. CRITERR.ASM
  66. TRAP CRITICAL ERRORS FROM W/IN C
  67.  
  68.      58                     ; SEE DOS TECHNICAL REFERENCE FOR EXPLANATION OF CODES
  69.      59
  70.      60
  71.      61                     ;;;;; BEGIN DATA SEGMENT ;;;;;  USING SIMPLIFIED SEGMENT DIRECTIVES
  72.      62
  73.      63    0000                     .DATA             ; begin data segment
  74.      64                         extrn __osmajor:byte    ; operating system    version
  75.      65    0000  00             _criterrtrap    db    0         ; critical    error flag 1=trapped, 0    = off
  76.      66                     ;;;;;   GLOBAL  ;;;;;
  77.      67                         public _cerr         ; GLOBALS
  78.      68    0001  1F*(??)             _cerr   CERR <>             ; CRITICAL    ERROR STRUCTURE    BLOCK
  79.      69
  80.      70    0020                     .DATA?             ; uninitialized data
  81.      71    0000                 _oldint24vec    label  dword
  82.      72    0000  ????             _oldint24off    dw    ?         ; static vector to    int 24 before trap
  83.      73    0002  ????             _oldint24seg    dw    ?         ;
  84.      74
  85.      75
  86.      76                     ; PROCEDURE CRITERR( ONOFF    )
  87.      77                     ; SETS ALTERNATE CRITICAL ERROR HANDLER
  88.      78                     ; USAGE:         criterr( 1    ) to set, criterr( 0 ) to turn off
  89.      79
  90.      80    0004                     .CODE             ; begin code segment
  91.      81
  92.      82    0000  0000             savds   dw         0             ; save proper data    segment
  93.      83
  94.      84                         public _criterr
  95.      85    0002                 _criterr         proc    far
  96.      86    0002  55                 push bp
  97.      87    0003  8B EC                 mov bp, sp
  98.      88    0005  56                 push si
  99.      89    0006  57                 push di
  100.      90    0007  8B 46 06                 mov ax, p[bp]         ; see if a    0 or 1 was passed
  101.      91    000A  85 C0                 test ax, ax         ; non zero?
  102.      92    000C  75 1C                 jne settrap         ; 1, so set trap
  103.      93    000E                 removetrap:
  104.      94    000E  80 3E 0000r 01             cmp _criterrtrap, 1     ; see if installed
  105.      95    0013  75 45                 jne done             ; not installed, so return
  106.      96    0015  1E                 push ds
  107.      97    0016  C5 16 0000r             lds dx, _oldint24vec    ; restore original    int 24 vector
  108.      98    001A  B8 2524                 mov ax, 2524h
  109.      99    001D  CD 21                 int 21h             ; dos set vector function
  110.     100    001F  1F                 pop ds
  111.     101    0020  C6 06 0000r 00             mov _criterrtrap, 0     ; reset flag
  112.     102    0025  33 C0                 xor ax, ax             ; set return code
  113.     103    0027  EB 31 90                 jmp done
  114.     104    002A                 settrap:
  115.     105    002A  80 3E 0000r 01             cmp _criterrtrap, 1     ; see if installed
  116.     106    002F  74 29                 je     done             ; yes, so return (AX = 1)
  117.     107    0031  2E: 8C 1E    0000r             mov cs:savds, ds         ; move current data segment to savds
  118.     108    0036  06                 push    es
  119.     109    0037  B8 3524                 mov     ax,03524h         ; save old    vector to int 24
  120.     110    003A  CD 21                 int     021h
  121.     111    003C  89 1E 0000r             mov _oldint24off,bx
  122.     112    0040  8C 06 0002r             mov _oldint24seg,es
  123.     113    0044  07                 pop     es
  124.     114    0045  1E                 push    ds
  125. Turbo Assembler     Version 2.0        02/17/91 12:40:52        Page 3
  126. criterr.asm
  127. CRITERR.ASM
  128. TRAP CRITICAL ERRORS FROM W/IN C
  129.  
  130.     115    0046  BA 0065r                 mov     dx, offset    cs:int_service         ; load address of new routine
  131.     116    0049  8C C8                 mov     ax,cs
  132.     117    004B  8E D8                 mov     ds,ax
  133.     118    004D  B8 2524                 mov     ax,02524h         ; set it
  134.     119    0050  CD 21                 int     021h
  135.     120    0052  1F                 pop     ds
  136.     121    0053  C6 06 0000r 01             mov _criterrtrap, 1     ; set flag
  137.     122    0058  33 C0                 xor ax, ax             ;set return code
  138.     123
  139.     124    005A                 done:
  140.     125    005A  50                 push ax                 ; save AX
  141.     126    005B  0E E8 008C 90             call far ptr _clrcriterr         ; reset values
  142.     127    0060  58                 pop ax
  143.     128    0061  5F                 pop di
  144.     129    0062  5E                 pop si
  145.     130    0063  5D                 pop bp
  146.     131    0064  CB                 ret             ; return to caller, return    code in    AX
  147.     132
  148.     133
  149.     134                     ;;;;; NEW CRITICAL    ERROR HANDLER ;;;;;
  150.     135                     ;;;;; SEE DOS TECHNICAL REFERENCE ;;;;;
  151.     136
  152.     137    0065                 int_service:             ;int 24 trap goes here
  153.     138    0065  55                 push    bp
  154.     139    0066  8B EC                 mov     bp,sp         ; set to critical stack frame
  155.     140    0068  53                 push    bx             ; all used    registers except AX must be
  156.     141    0069  51                 push    cx             ; saved !!!!!
  157.     142    006A  52                 push    dx
  158.     143    006B  56                 push    si
  159.     144    006C  57                 push    di
  160.     145    006D  1E                 push    ds
  161.     146    006E  06                 push    es
  162.     147    006F  9C                 pushf
  163.     148    0070  2E: 8E 1E    0000r             mov     ds,cs:savds     ; reset ds    to program's ds
  164.     149    0075  8B DF                 mov     bx, di         ; save DI
  165.     150    0077  BF 0001r                 mov     di, offset    _cerr  ; set di    to point to structure cerr
  166.     151    007A  C6 05 01                 mov     ceflag[di], 1   ; set ceflag 2/16/91
  167.     152    007D  88 5D 01                 mov     cerrno[di], bl  ; move to cerrno -- move byte on